#!/bin/bash

# POST-COMMIT HOOK OF SVN
#
# 用途
# 用于自动部署项目，当svn库有提交时，通过钩子触发此脚本，
# 在项目部署目录下自动执行代码更新、构建、部署操作
#
#
# 使用
# 当svn库就在部署服务器上时，可以在svn库的hooks/post-commit中，调用本脚本，
# 或者直接把本脚本改名为post-commit，替换hooks/post-commit
#
#
# 远程
# 对于部署服务器跟svn服务器互相独立的情况，可在svn库的hooks/post-commit中，
# 通过curl调用部署服务器上的url，然后由web程序中转调用本脚本，例如：
# vi /var/www/ZZGL/backend/web/post-commit.php
# <?php
# ini_set('display_errors', 'on');
# header('Content-type: text/plain');
# $cmd   = __DIR__."/post-commit.sh {$_GET['repos']} {$_GET['rev']}";
# echo `sudo $cmd 2>&1`;      // execute the shell by sudo
#
#
# 权限
# 必须确保执行脚本时，对项目部署目录有写入权限，可有两种方法：
#
# 1. 把项目部署目录的权限设置为脚本的执行账号可写，例如：
# chgrp apache -R /var/www/ZZGL
# chmod g+x -R /var/www/ZZGL
#
# 2. 通过sudo设置，把本脚本设成可切换为具有可写权限的账号执行，例如：
# vi /etc/sudoers.d/apache
# apache ALL=(root) NOPASSWD:/var/www/ZZGL/backend/web/post-commit.sh
# 注意：这种方法必须把脚本设置为禁止其他用户修改，防止被篡改脚本，以切换账号的身份进行攻击
#
#
# 改写
# 用于不同的项目，根据项目情况修改设置，包括项目部署目录、对应的svn库以及账号，
# 然后补充完成配置、构建、部署的处理：
# 1.按部署环境修改配置
# 2.执行项目构建
# 3.可执行文件部署

# 参数处理
if [ $# -lt 2 ]
then
   echo 'usage: post-commit.sh [repos] [rev]'
   exit 1
fi

REPOS=$1
REV=$2

# 项目部署目录，对应的svn库以及账号
PRJ_DIR='/var/www/ZZGL'
SVN_REPOS='/var/svn/zzgl'
SVN_USER='zhaoh'
SVN_PSWD='744207866'

# 只处理目标库的更新
if [ $REPOS != $SVN_REPOS ]
then
  echo "Error: unknown repository '$REPOS'"
  exit 2
fi

# 更新项目代码
echo 'Begin to update revision'
svn up $PRJ_DIR --username $SVN_USER --password $SVN_PSWD --force
echo 'The revision updating finished'

# 查看更新后版本信息
svn info $PRJ_DIR

# 修改配置
sed -r -e "5,9s/'dsn' => '[^']+',/'dsn' => 'mysql:host=localhost;dbname=zzgl'/" \
    -e "5,9s/'username' => '[^']+'/'username' => 'zzgl'/" \
    -e "5,9s/'password' => '[^']*'/'password' => 'local password'/" \
    -i $PRJ_DIR/common/main-local.php

# 构建

# 部署

